package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.IEmpFamilyDAO;
import org.jsola.hr.dto.EmpFamilyAddDTO;
import org.jsola.hr.dto.EmpFamilyDTO;
import org.jsola.hr.dto.EmpFamilyUpdateDTO;
import org.jsola.hr.entity.EmpFamilyDO;
import org.jsola.hr.query.EmpFamilyQuery;
import org.jsola.hr.vo.EmpFamilyListVO;
import org.jsola.hr.vo.EmpFamilyVO;
import org.jsola.user.core.TokenUser;

import javax.validation.constraints.NotNull;
import java.util.List;


/**
 * 员工家庭成员
 *
 * @author zhr
 */
public interface IEmpFamilyService extends IService<IEmpFamilyDAO, EmpFamilyDO> {

    /**
     * 新增员工家庭成员
     * @param empFamilyAddDTO 新增员工家庭成员DTO
     * @param tokenUser 当前用户
     * @return 员工家庭成员详情信息
     */
    EmpFamilyVO save(EmpFamilyAddDTO empFamilyAddDTO, TokenUser tokenUser);

    /**
     * 修改员工家庭成员
     * @param empFamilyUpdateDTO 修改员工家庭成员DTO
     * @param tokenUser 当前用户
     * @return 更新数量
     */
    int update(EmpFamilyUpdateDTO empFamilyUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除员工家庭成员，物理删除，更新is_valid字段，从回收站删除
     * @param tokenUser 当前用户
     * @param empFamilyIds 员工家庭成员id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String...empFamilyIds);

    /**
     * 根据员工家庭成员id查找
     * @param empFamilyId 员工家庭成员id
     * @param siteId 所属站点id
     * @return 员工家庭成员详情信息
     */
    EmpFamilyVO selectById(String empFamilyId, String siteId);

    /**
     * 查询员工家庭成员
     * @param empFamilyQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工家庭成员列表信息
     */
    List<EmpFamilyListVO> select(EmpFamilyQuery empFamilyQuery, String siteId);

    /**
    * 查询员工家庭成员记录数
    * @param empFamilyQuery 查询条件
    * @param siteId 所属站点id
    * @return 员工家庭成员记录数
    */
    int selectCount(EmpFamilyQuery empFamilyQuery, String siteId);

    /**
     * 分页查询员工家庭成员
     * @param empFamilyQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工家庭成员列表信息
     */
    Page<EmpFamilyListVO> selectPage(EmpFamilyQuery empFamilyQuery, String siteId);


    /**
     * 根据员工家庭成员id查找
     * @param empFamilyId 员工家庭成员id
     * @param siteId 所属站点id
     * @return 员工家庭成员
     */
    EmpFamilyDO selectDOById(String empFamilyId, String siteId);

    /**
     * 查询员工家庭成员
     * @param empFamilyQuery 查询条件
     * @param siteId 所属站点id
     * @return 员工家庭成员列表
     */
    List<EmpFamilyDO> selectDO(EmpFamilyQuery empFamilyQuery, String siteId);

    /**
     * 查找某员工的所有家庭成员
     *
     * @param empId  员工id
     * @param siteId 站点
     * @return 员工的所有家庭成员
     */
    List<EmpFamilyDO> listByEmpId(String empId, String siteId);

    /**
     * 根据公司id删除有家庭成员
     *
     * @param companyId 公司id
     * @param tokenUser 当前用户
     */
    void deleteByCompanyId(@NotNull String companyId, TokenUser tokenUser);

    /**
     * 员工家庭成员
     *
     * @param empFamilyList 员工证书
     * @param companyId     公司id
     * @param empId         人员id
     * @param tokenUser     当前用户
     */
    void publishEmpFamilyList(List<EmpFamilyDTO> empFamilyList, String companyId, String empId, TokenUser tokenUser);

}


